<?php

/**
 * Générateur de mappeur de table
 *
 * @package App_Model_Tool
 * @author  nroche <nicolas.roche42@gmail.com>
 *
 * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
 * @SuppressWarnings(PHPMD.ExcessiveClassLength)
 * @SuppressWarnings(PHPMD.TooManyMethods)
 *
 */
class App_Model_Tools_MapperGenerator
{
//     protected $_tableName;
//     protected $_className;
//     protected $_description = array();
//     protected $_primaryKey = array();
//     protected $_package;

//     /**
//      * fonction de génération
//      *
//      * @param string $table     table
//      * @param string $className nom de la classe
//      * @param string $package   package de la classe
//      * @param string $prefixe   prefixe de colonne à supprimer
//      *
//      * @return array tableau des chemins des fichiers générés
//      */
//     public function generate($table, $className, $package, $prefixe = '')
//     {
//         $database = Zend_Db_Table::getDefaultAdapter();
//         $this->_description = $database->describeTable($table);

//         $this->_tableName = $table;
//         $this->_className = ucfirst($className);
//         $this->_package = $package;

//         foreach ($this->_description as $name => $column) {

//             // nom de colonne en camel case
//             $this->_description[$name]['CAMEL_CASE'] = ucfirst(
//                 str_replace(
//                     ucfirst($prefixe),
//                     '',
//                     $this->_toCamelCase($name, true)
//                 )
//             );
//             $this->_description[$name]['PHP_TYPE'] = $this->_getPhpType($column['DATA_TYPE']);

//             // données aléatoires
//             $this->_description[$name]['RANDOM1'] = $this->_getRandomData($column);
//             $this->_description[$name]['RANDOM2'] = $this->_getRandomData($column);

//             // clef primaire
//             if ($column['PRIMARY']) {
//                 $this->_primaryKey[$name] = $this->_description[$name];
//             }
//         }
        
//         $result = array();

//         $result['dbTable'] = $this->_generateDbTableClass();
//         $result['bean'] = $this->_generateBeanClass();
//         $result['mapper'] = $this->_generateMapperClass();
//         $result['tests'] = $this->_generateTestClass();

//         return $result;
//     }

//     /**
//      * Fait la correspondance entre un type de la base de données et le type PHP
//      *
//      * @param string $type type de base de données
//      *
//      * @return string type correspondant en PHP
//      */
//     protected function _getPhpType($type)
//     {
//         switch (strtolower($type)) {
//             case 'int':
//             case 'integer':
//             case 'timestamp':
//                 $type = 'int';
//                 break;

//             case 'double':
//             case 'float':
//                 $type = 'double';
//                 break;

//             case 'boolean':
//             case 'bool':
//                 $type = 'boolean';
//                 break;

//             default:
//                 $type = 'string';
//                 break;
//         }
//         return $type;
//     }

//     /**
//      * Génère une donnée aléatoire en fonction de la description d'une colonne
//      *
//      * @param array $column colonne
//      */
//     protected function _getRandomData($column)
//     {
//         $value = 0;
//         $date = new Zend_Date();
//         $date->addDay(mt_rand(-1000, 1000));
//         $date->addSecond(mt_rand(-10000, 10000));
//         if ($column['DATA_TYPE'] == 'date') {
//             $value = $date->toString(
//                 Zend_Date::YEAR
//                 . '-'
//                 . Zend_Date::MONTH
//                 . '-'
//                 . Zend_Date::DAY
//             );
//         } elseif ($column['DATA_TYPE'] == 'datetime') {
//             $value = $date->toString(
//                 Zend_Date::YEAR
//                 . '-'
//                 . Zend_Date::MONTH
//                 . '-'
//                 . Zend_Date::DAY
//                 . ' '
//                 . Zend_Date::HOUR
//                 . ':'
//                 . Zend_Date::MINUTE
//                 . ':'
//                 . Zend_Date::SECOND
//             );
//         } else {
//             switch ($this->_getPhpType($column['DATA_TYPE'])) {
//                 case 'int':
//                     $value = mt_rand(0, 10000);
//                     break;
//                 case 'double':
//                     $value = sprintf("%01.2f", mt_rand() / mt_getrandmax() * (10000), 2);
//                     break;
//                 case 'boolean':
//                     $value = ((mt_rand(0, 1) == 0)?'true':'false');
//                     break;
//                 default:
//                     $length = (($column['LENGTH'])?$column['LENGTH']:30);
//                     $value = App_Model_Tool_LoremIpsumGenerator::generate($length);
//                     break;
//             }
//         }

//         return $value;
//     }

//     /**
//      * Génère une classe de connexion à la base de données héritant de {@link Zend_Db_Table_Abstract}
//      *
//      * @return string chemin du fichier créé
//      */
//     protected function _generateDbTableClass()
//     {
//         $class = new Zend_CodeGenerator_Php_Class();
//         $class->setName($this->_package . '_DbTable_' . $this->_className);
//         $class->setExtendedClass('Zend_Db_Table_Abstract');

//         $docblock = new Zend_CodeGenerator_Php_Docblock(
//             array(
//                 'shortDescription' => 'Instance de {@link Zend_Db_Table_Abstract} pour la table \''
//                 . $this->_tableName
//                 . '\'.',
//                 'longDescription' => 'Classe a été générée à l\'aide du composant {@link Zend_CodeGenerator}.',
//                 'tags'             => array(
//                     array(
//                         'name'        => 'package',
//                         'description' => $this->_package . '_DbTable',
//                     ),
//                     array(
//                         'name'        => 'author',
//                         'description' => ' nroche <nicolas.roche42@gmail.com>',
//                     ),
//                 ),
//             )
//         );
//         $class->setDocblock($docblock);

//         $property = new Zend_CodeGenerator_Php_Property(
//             array(
//                 'name' => '_name',
//                 'visibility' => 'protected',
//                 'defaultValue' => $this->_tableName,
//             )
//         );
//         $property->setDocblock(
//             array(
//                 'shortDescription' => 'Nom de la table',
//                 'tags' => array(
//                     array(
//                         'name' => 'var',
//                         'description' => 'string',
//                     ),
//                 ),
//             )
//         );
//         $class->setProperty($property);

//         // chemin du fichier
//         $path = APPLICATION_PATH . '/../data/generator/DbTable/' . $this->_className . '.php';
        
//         file_put_contents(
//             $path,
//             "<?php\n\n" . $class->generate()
//         );
        
//         return $path;
//     }

//     /**
//      * Génère une classe de type bean avec un attribut par colonne et tous les getters et setters
//      *
//      * @return string chemin du fichier créé
//      */
//     protected function _generateBeanClass()
//     {
//         $class = new Zend_CodeGenerator_Php_Class();
//         $class->setName($this->_package . '_' . $this->_className);

//         $docblock = new Zend_CodeGenerator_Php_Docblock(
//             array(
//                 'shortDescription' => 'Classe représentant un enregistrement dans la table \''
//                 . $this->_tableName
//                 . '\'.',
//                 'longDescription' => 'Classe a été générée à l\'aide du composant {@link Zend_CodeGenerator}.',
//                 'tags'             => array(
//                     array(
//                         'name'        => 'package',
//                         'description' => $this->_package,
//                     ),
//                     array(
//                         'name'        => 'author',
//                         'description' => ' nroche <nicolas.roche42@gmail.com>',
//                     ),
//                 ),
//             )
//         );
//         $class->setDocblock($docblock);

//         // attributs
//         foreach ($this->_description as $name => $column) {
//             $property = new Zend_CodeGenerator_Php_Property(
//                 array(
//                     'name' => '_' . lcfirst($column['CAMEL_CASE']),
//                     'visibility' => 'protected',
//                     ''
//                 )
//             );
//             $property->setDocblock(
//                 array(
//                     'shortDescription' => 'Attribut de la colonne \'' . $name . '\'.',
//                     'tags' => array(
//                         array(
//                             'name' => 'var',
//                             'description' => $column['PHP_TYPE'],
//                         ),
//                     ),
//                 )
//             );
//             $class->setProperty($property);
//             $this->_generateGetterSetter($class, $column);
//         }
        
//         $path = APPLICATION_PATH . '/../data/generator/' . $this->_className . '.php';

//         file_put_contents(
//             $path,
//             "<?php\n\n" . $class->generate()
//         );
        
//         return $path;
//     }

//     /**
//      * Crée un getter et un setter pour la classe
//      *
//      * @param Zend_CodeGenerator_Php_Class $class  classe
//      * @param array                        $column données de la colonne
//      */
//     protected function _generateGetterSetter(Zend_CodeGenerator_Php_Class $class, array $column)
//     {
//         // getter
//         $getter = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name'       => 'get' . $column['CAMEL_CASE'],
//                 'body'       => 'return $this->_' . lcfirst($column['CAMEL_CASE']) . ';',
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Getter de l\'attribut \'_' . lcfirst($column['CAMEL_CASE']) . '\'',
//                         'tags'             => array(
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Return(
//                                 array(
//                                     'datatype'  => $column['PHP_TYPE'],
//                                     'description' => 'valeur de l\'attribut \'_'
//                                         . lcfirst($column['CAMEL_CASE']) . '\'',
//                                 )
//                             ),
//                         ),
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($getter);

//         // setter
//         $setter = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name' => 'set' . $column['CAMEL_CASE'],
//                 'parameters' => array(
//                     array('name' => lcfirst($column['CAMEL_CASE'])),
//                 ),
//           'body' => '$this->_' . lcfirst($column['CAMEL_CASE']) . ' = $' . lcfirst($column['CAMEL_CASE']) . ';',
//                 'docblock' => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Setter de l\'attribut \'_' . lcfirst($column['CAMEL_CASE']) . '\'',
//                         'tags'             => array(
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Param(
//                                 array(
//                                     'paramName' => lcfirst($column['CAMEL_CASE']),
//                                     'datatype'  => $column['PHP_TYPE'],
//                                     'description' => 'nouvelle valeur de l\'attribut \'_'
//                                     . lcfirst($column['CAMEL_CASE']) . '\'',
//                                 )
//                             ),
//                         ),
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($setter);
//     }



//     /**
//      * Génère une classe de mappage avec la base de données
//      *
//      * @return string chemin du fichier créé
//      */
//     protected function _generateMapperClass()
//     {
//         $class = new Zend_CodeGenerator_Php_Class();
//         $class->setName($this->_package . '_' . $this->_className . 'Mapper');

//         $docblock = new Zend_CodeGenerator_Php_Docblock(
//             array(
//                 'shortDescription' => 'Data Mapper pour la table \'' . $this->_tableName . '\'.',
//                 'longDescription' => 'Classe a été générée à l\'aide du composant {@link Zend_CodeGenerator}.',
//                 'tags'             => array(
//                     array(
//                         'name'        => 'package',
//                         'description' => $this->_package,
//                     ),
//                     array(
//                         'name'        => 'author',
//                         'description' => ' nroche <nicolas.roche42@gmail.com>',
//                     ),
//                 ),
//             )
//         );
//         $class->setDocblock($docblock);


//         $property = new Zend_CodeGenerator_Php_Property(
//             array(
//                 'name' => '_dbTable',
//                 'visibility' => 'protected',
//                 'static' => true,
//             )
//         );
//         $property->setDocblock(
//             array(
//                 'shortDescription' => 'DbTable pour la table  \'' . $this->_tableName . '\'.',
//                 'tags' => array(
//                     array(
//                         'name' => 'var',
//                         'description' => 'Zend_Db_Table_Abstract',
//                     ),
//                 ),
//             )
//         );
//         $class->setProperty($property);

//         $this->_generateDbTableGetterSetter($class);
//         $this->_generateGetRowData($class);
//         $this->_generatePopulate($class);
//         $this->_generateInsert($class);
//         $this->_generateUpdate($class);
        
//         $path = APPLICATION_PATH . '/../data/generator/' . $this->_className . 'Mapper.php';

//         file_put_contents(
//             $path,
//             "<?php\n\n" . $class->generate()
//         );
        
//         return $path;
//     }

//     /**
//      * génère la méthode 'setDbTable'
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generateDbTableGetterSetter(Zend_CodeGenerator_Php_Class $class)
//     {
//         // getter
//         $body = 'if (null === self::$_dbTable) {
//     self::setDbTable(\'' . $this->_package . '_DbTable_' . $this->_className . '\');
// }
// return self::$_dbTable;';

//         $getter = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name'       => 'getDbTable',
//                 'body'       => $body,
//                 'static' => true,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Getter de l\'instance DbTable',
//                         'tags'             => array(
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Return(
//                                 array(
//                                     'datatype'  => 'Zend_Db_Table_Abstract'
//                                 )
//                             )
//                         ),
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($getter);

//         // setter
//         $body = 'if (is_string($dbTable)) {
//     $dbTable = new $dbTable();
// }
// if (!$dbTable instanceof Zend_Db_Table_Abstract) {
//     throw new Exception(\'Invalid table data gateway provided\');
// }
// self::$_dbTable = $dbTable;';

//         $setter = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name'       => 'setDbTable',
//                 'parameters' => array(
//                     array('name' => 'dbTable'),
//                 ),
//                 'body'       => $body,
//                 'static' => true,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Setter de l\'instance DbTable',
//                         'tags'             => array(
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Param(
//                                 array(
//                                     'paramName' => 'dbTable',
//                                     'datatype'  => 'string|Zend_Db_Table_Abstract',
//                                     'description' => 'instance de Zend_Db_Table_Abstract ou nom de la '
//                                     . 'classe de Zend_Db_Table_Abstract' . "\n",
//                                 )
//                             ),
//                             array(
//                                 'name' => 'throw',
//                                 'description' => 'Exception' . "\n",
//                             ),
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Return(
//                                 array(
//                                     'datatype'  => $this->_package . '_' . $this->_className . 'Mapper'
//                                 )
//                             )
//                         ),
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($setter);
//     }

//     /**
//      * Génrère la méthode getRowData qui convertie une instance de bean en donnée sous forme
//      * de tableau pour l'insertion ou la mise à jour de données
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generateGetRowData(Zend_CodeGenerator_Php_Class $class)
//     {
//         $body = 'return array(' . "\n";
//         foreach ($this->_description as $name => $column) {
//             $body .= '    \''
//             . $name . '\' => $'
//             . lcfirst($this->_className)
//             . '->get'
//             . $column['CAMEL_CASE'] . '(),' . "\n";
//         }
//         $body .= ');';

//         $method = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name'       => 'getRowData',
//                 'visibility' => 'public',
//                 'static' => true,
//                 'parameters' => array(
//                     array('name' => lcfirst($this->_className)),
//                 ),
//                 'body'       => $body,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Crée et retourne le tableau de données pour insert/update en base',
//                         'tags'             => array(
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Param(
//                                 array(
//                                     'paramName' => lcfirst($this->_className),
//                                     'datatype'  => $this->_package . '_' . $this->_className,
//                                     'description' => 'Instance à convertir' . "\n",
//                                 )
//                             ),
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Return(
//                                 array(
//                                     'datatype'  => 'array'
//                                 )
//                             )
//                         ),
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($method);
//     }

//     /**
//      * Génrère la méthode getRowData qui convertie une instance de bean en donnée sous forme
//      * de tableau pour l'insertion ou la mise à jour de données
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generatePopulate(Zend_CodeGenerator_Php_Class $class)
//     {
//         $body = '';
//         foreach ($this->_description as $name => $column) {
//             $body .= '$' . lcfirst($this->_className) . '->set' . $column['CAMEL_CASE']
//             . '(
//     (array_key_exists(\'' . $name . '\', $data)?$data[\'' . $name . '\']:null)
// );'
//             . "\n";
//         }

//         $fullClassName = $this->_package . '_' . $this->_className;
//         $method = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name'       => 'populate',
//                 'visibility' => 'public',
//                 'static' => true,
//                 'parameters' => array(
//                     array(
//                         'name' => lcfirst($this->_className),
//                         'datatype'  => $fullClassName,
//                     ),
//                     array('name' => 'data'),
//                 ),
//                 'body'       => $body,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Peuple l\'instance avec les données d\'un tableau',
//                         'tags'             => array(
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Param(
//                                 array(
//                                     'paramName' => lcfirst($this->_className),
//                                     'datatype'  => $fullClassName,
//                                     'description' => 'Instance à peupler',
//                                 )
//                             ),
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Param(
//                                 array(
//                                     'paramName' => 'data'
//                                         . $this->_generateSpaces(strlen($this->_className) - strlen('data')),
//                                     'datatype'  => 'array'
//                                         . $this->_generateSpaces(strlen($fullClassName) - strlen('array')),
//                                     'description' => 'Données destinées à peupler l\'instance',
//                                 )
//                             )
//                         ),
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($method);
//     }

//     /**
//      * Génère la méthode insert
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generateInsert(Zend_CodeGenerator_Php_Class $class)
//     {
//         $body = 'return self::getDbTable()->insert(self::getRowData($' . lcfirst($this->_className) . '));';

//         $method = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name' => 'insert',
//                 'visibility' => 'public',
//                 'static' => true,
//                 'parameters' => array(
//                     array('name' => lcfirst($this->_className)),
//                 ),
//                 'body'       => $body,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Insère un nouvel enregistrement en base',
//                         'tags'             => array(
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Param(
//                                 array(
//                                     'paramName' => lcfirst($this->_className),
//                                     'datatype'  => $this->_package . '_' . $this->_className,
//                                     'description' => 'Instance de à insérer' . "\n",
//                                 )
//                             ),
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Return(
//                                 array(
//                                     'datatype'  => 'mixed',
//                                     'description' => 'clef primaire de l\'instance insérée',
//                                 )
//                             )
//                         ),
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($method);
//     }

//     /**
//      * Génère la méthode update
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generateUpdate(Zend_CodeGenerator_Php_Class $class)
//     {

//         $body = '$db = Zend_Db_Table::getDefaultAdapter();

// // clause where pour filtrer sur la clef primaire
// $whereClause = array(';

//         // clause where pour la clef primaire
//         foreach ($this->_primaryKey as $name => $column) {
//             $body .= "\n" . '    $db->quoteInto(\'' . $name . ' = ?\', $'
//             . lcfirst($this->_className) . '->get' . $column['CAMEL_CASE'] . '()),';
//         }

//         $body .= '
// );

// return self::getDbTable()->update(self::getRowData($' . lcfirst($this->_className) . '), $whereClause);';

//         $method = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name' => 'update',
//                 'visibility' => 'public',
//                 'static' => true,
//                 'parameters' => array(
//                     array('name' => lcfirst($this->_className)),
//                 ),
//                 'body'       => $body,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Met à jour un enregistrement en base',
//                         'tags'             => array(
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Param(
//                                 array(
//                                     'paramName' => lcfirst($this->_className),
//                                     'datatype'  => $this->_package . '_' . $this->_className,
//                                     'description' => 'Instance de à mettre à jour' . "\n",
//                                 )
//                             ),
//                             new Zend_CodeGenerator_Php_Docblock_Tag_Return(
//                                 array(
//                                     'datatype'  => 'int',
//                                     'description' => 'nombre d\'enregistrements mis à jour'
//                                 )
//                             )
//                         ),
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($method);
//     }

//     /**
//      * Génère une classe de test PHPUnit
//      *
//      * @return string chemin du fichier créé
//      */
// //     protected function _generateTestClass()
// //     {
// //         $class = new Zend_CodeGenerator_Php_Class();
// //         $class->setName($this->_package . '_' . $this->_className . 'Test');
// //         $class->setExtendedClass('           Test_PHPUnit_SQLiteDBMockTestCase');

// //         $docblock = new Zend_CodeGenerator_Php_Docblock(
// //             array(
// //                 'shortDescription' => 'Classe de test pour le mapper de la table \''
// //                 . $this->_tableName
// //                 . '\'.',
// //             'longDescription' => 'Classe a été générée à l\'aide du composant {@link Zend_CodeGenerator}.',
// //                 'tags'             => array(
// //                     array(
// //                         'name'        => 'package',
// //                         'description' => $this->_package,
// //                     ),
// //                     array(
// //                         'name'        => 'author',
// //                         'description' => ' nroche <nicolas.roche42@gmail.com>',
// //                     ),
// //                 ),
// //             )
// //         );
// //         $class->setDocblock($docblock);

// //         // fonction setup/tearDown qui initialise la base de données et le mapper
// //         $this->_generateTestSetup($class);
// //         $this->_generateTestPopulateGetRowData($class);
// //         $this->_generateTestInsert($class);
// //         $this->_generateTestUpdate($class);

// //         $path = APPLICATION_PATH . '/../data/generator/' . $this->_className . 'Test.php';
        
// //         file_put_contents(
// //             $path,
// //             "<?php\n\n" . $class->generate()
// //         );
        
// //         return $path;
// //     }

//     /**
//      * Génère la méthode setup
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generateTestSetup(Zend_CodeGenerator_Php_Class $class)
//     {
//         $body = '// Initialisation d\'une base de données temporaire
// parent::setup();

// // Création de la table de test
// $this->_db->query(
//     "CREATE TABLE IF NOT EXISTS `' . $this->_tableName . '` (';

//         foreach ($this->_description as $name => $column) {

//             $length = '';
//             if (isset($column['LENGTH'])) {
//                 $length = '(' . $column['LENGTH'] . ')';
//             }

//             $null = 'NULL';
//             if (!$column['NULLABLE']) {
//                 $null = 'NOT NULL';
//             }

//             $default = '';
//             if (isset($column['DEFAULT'])) {
//                 $default = 'DEFAULT `' . $column['DEFAULT'] . '`';
//             }

//             $body .= '
//         `' . $name . '` ' . $column['DATA_TYPE'] . $length . ' ' . $default . ' ' . $null . ',';
//         }

//         $primaryKey = 'PRIMARY KEY (';
//         $tempArray = array();
//         foreach ($this->_primaryKey as $name => $column) {
//             $tempArray[] = '`' . $name . '`';
//         }
//         $primaryKey .= implode(', ', $tempArray) . ')';

//         $body .= '
//         ' . $primaryKey . '
//     )"
// );

// ' . $this->_package . '_' . $this->_className . 'Mapper::setDbTable('
// . 'new ' . $this->_package . '_DbTable_' . $this->_className . '());

// // création d\'enregistrements aléatoires
// $this->_db->insert(
//     \'' . $this->_tableName . '\',
//     array(
// ';

//         foreach ($this->_description as $name => $column) {
//             $body .= '       \'' . $name . '\' => \'' . $column['RANDOM1'] . '\',
// ';
//         }

//         $body .= '    )
// );
// ';

//         $method = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name' => 'setup',
//                 'visibility' => 'protected',
//                 'body'       => $body,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Initialise la base de données et le mapper',
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($method);
//     }
    
//     /**
//      * Génère la méthode de teste des méthodes populate et getRowData
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generateTestPopulateGetRowData(Zend_CodeGenerator_Php_Class $class)
//     {
//         $body = '// Données de test
// $data = array(
// ';
        
//         // tableau de test
//         foreach ($this->_description as $name => $column) {
//             $body .= '    \'' . $name . '\' => \'' . $column['RANDOM1'] . '\',
// ';
//         }
        
//         $body .= ');

// // Instance de test
// $bean = new ' . $this->_package . '_' . $this->_className . '();
// ' . $this->_package . '_' . $this->_className . 'Mapper::populate($bean, $data);

// // Test des getters
// ';
        
//         foreach ($this->_description as $name => $column) {
//         $body .= '$this->assertEquals($data[\'' . $name . '\'], $bean->get' . $column['CAMEL_CASE'] . '());' . "\n";
//         }
        
//         $body .= '
// $this->assertEquals($data, ' . $this->_package . '_' . $this->_className . 'Mapper::getRowData($bean));

// // Même test avec un tableau vide
// ' . $this->_package . '_' . $this->_className . 'Mapper::populate($bean, array());

// // Test des getters
// ';
        
//         foreach ($this->_description as $name => $column) {
//             $body .= '$this->assertEquals(null, $bean->get' . $column['CAMEL_CASE'] . '());' . "\n";
//         }
        
//         $body .= '$this->assertEquals(
//     array(
// ';
//         // tableau de valeurs null
//         foreach ($this->_description as $name => $column) {
//             $body .= '        \'' . $name . '\' => null,
// ';
//         }
//         $body .= '    ),
//     ' . $this->_package . '_' . $this->_className . 'Mapper::getRowData($bean)
// );';


//         $method = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name' => 'testPopulateGetRowData',
//                 'visibility' => 'public',
//                 'body'       => $body,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Teste les méthodes populate et getRowData',
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($method);
//     }

//     /**
//      * Génère la méthode testInsert
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generateTestInsert(Zend_CodeGenerator_Php_Class $class)
//     {
//         $body = '$bean = new ' . $this->_package . '_' . $this->_className . '();
// ';

//         foreach ($this->_description as $name => $column) {
//             $body .= '$bean->set' . $column['CAMEL_CASE'] . '(\'' . $column['RANDOM2'] . '\');
// ';
//         }

//         // test d'ajout
//         if (count($this->_primaryKey) == 1) {
//             $column = array_shift(array_values($this->_primaryKey));
//             $body .= '// Test d\'ajout
// $this->assertEquals(\'' . $column['RANDOM2'] . '\', '
// . $this->_package . '_' . $this->_className . 'Mapper::insert($bean));';
//         } else {
//             $body .= '// Test d\'ajout
// $this->assertEquals(
//     array (';
//             foreach ($this->_primaryKey as $name => $column) {
//                 $body .= '
//         \'' . $name . '\' => \'' . $column['RANDOM2'] . '\',';
//             }
//             $body .= '
//     ),
//     ' . $this->_package . '_' . $this->_className . 'Mapper::insert($bean)
// );';
//         }

//         $body .= '

// // Test de récupération de l\'enregistrement ajouté
// $result = ' . $this->_package . '_' . $this->_className . 'Mapper::getDbTable()->find(';
//         foreach ($this->_primaryKey as $name => $column) {
//             $body .= '\'' . $column['RANDOM2'] . '\', ';
//         }
//         $body = substr($body, 0, strlen($body) - 2);
//         $body .= ');
// $this->assertEquals(1, $result->count());

// // Test des valeurs
// $row = $result->getRow(0)->toArray();
// ';
//         foreach ($this->_description as $name => $column) {
//             $body .= '$this->assertEquals($row[\'' . $name . '\'], \'' . $column['RANDOM2'] . '\');
// ';
//         }


//         $method = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name' => 'testInsert',
//                 'visibility' => 'public',
//                 'body'       => $body,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Teste la méthode insert',
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($method);
//     }

//     /**
//      * Génère la méthode testUpdate
//      *
//      * @param Zend_CodeGenerator_Php_Class $class classe
//      */
//     protected function _generateTestUpdate(Zend_CodeGenerator_Php_Class $class)
//     {
//         $body = '$bean = new ' . $this->_package . '_' . $this->_className . '();
// ';

//         foreach ($this->_description as $name => $column) {
//             if ($column['PRIMARY']) {
//                 $randomKey = 'RANDOM1';
//             } else {
//                 $randomKey = 'RANDOM2';
//             }
//             $body .= '$bean->set' . $column['CAMEL_CASE'] . '(\'' . $column[$randomKey] . '\');
// ';
//         }

//         $body .= '// Test de mise à jour
// $this->assertEquals(1, ' . $this->_package . '_' . $this->_className . 'Mapper::update($bean));

// // Test de récupération de l\'enregistrement ajouté
// $result = ' . $this->_package . '_' . $this->_className . 'Mapper::getDbTable()->find(';
//         foreach ($this->_primaryKey as $name => $column) {
//             $body .= '\'' . $column['RANDOM1'] . '\', ';
//         }
//         $body = substr($body, 0, strlen($body) - 2);
//         $body .= ');
// $this->assertEquals(1, $result->count());

// // Test des valeurs
// $row = $result->getRow(0)->toArray();
// ';
//         foreach ($this->_description as $name => $column) {
//             if ($column['PRIMARY']) {
//                 $randomKey = 'RANDOM1';
//             } else {
//                 $randomKey = 'RANDOM2';
//             }
//             $body .= '$this->assertEquals($row[\'' . $name . '\'], \'' . $column[$randomKey] . '\');
// ';
//         }


//         $method = new Zend_CodeGenerator_Php_Method(
//             array(
//                 'name' => 'testUpdate',
//                 'visibility' => 'public',
//                 'body'       => $body,
//                 'docblock'   => new Zend_CodeGenerator_Php_Docblock(
//                     array(
//                         'shortDescription' => 'Teste la méthode update',
//                     )
//                 ),
//             )
//         );
//         $class->setMethod($method);
//     }

//     /**
//      * Translates a camel case string into a string with underscores (e.g. firstName -&gt; first_name)
//      *
//      * @param string $str String in camel case format
//      *
//      * @return string $str Translated into underscore format
//      */
//     protected function _fromCamelCase($str)
//     {
//         $str[0] = strtolower($str[0]);
//         $func = create_function('$c', 'return "_" . strtolower($c[1]);');
//         return preg_replace_callback('/([A-Z])/', $func, $str);
//     }

//     /**
//      * Translates a string with underscores into camel case (e.g. first_name -&gt; firstName)
//      *
//      * @param string $str                 String in underscore format
//      * @param bool   $capitaliseFirstChar If true, capitalise the first char in $str
//      *
//      * @return string $str translated into camel caps
//      */
//     protected function _toCamelCase($str, $capitaliseFirstChar = false)
//     {
//         // on vire le dernier _ qui ne signifie que le type de la données en base
//         $str = explode('_', $str);
//         if (count($str) > 1) {
//             unset($str[count($str)-1]);
//         }
//         $str = implode('_', $str);
        
//         if ($capitaliseFirstChar) {
//             $str[0] = strtoupper($str[0]);
//         }
//         $func = create_function('$c', 'return strtoupper($c[1]);');
//         return preg_replace_callback('/_([a-z])/', $func, $str);
//     }
    
//     /**
//      * Créé une chaîne de caractères avec le nombre d'espaces désiré
//      *
//      * @param int $nbSpaces nombre d'espaces
//      *
//      * @return string
//      */
//     protected function _generateSpaces($nbSpaces)
//     {
//         $result = '';
//         for ($i = 0; $i < $nbSpaces; $i++) {
//             $result .= ' ';
//         }
//         return $result;
//     }
}